package frame;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import semantic.tables.Symbol;
import temp.Label;
import temp.Temp;
import temp.TempMap;
import tree.Exp;
import tree.ExpList;
import tree.Stm;
import util.List;
import assem.Instr;

public abstract class Frame implements TempMap {

	public Label name;

	/**
	 * Lista de Access - descrições de parâmetros e variáveis locais - denotando a localização dos parâmetros em tempo de execução
	 */
	public LinkedList<Access> formals;

	/**
	 * Cria um Frame para uma função com K parametros
	 * 
	 * @param name - label da função
	 * @param formals - lista de boolean de tamanho K, onde cada boolean I indica se o parametro I escapa (true) ou não escapa
	 *            (false)
	 * @return
	 */
	public abstract Frame newFrame(Symbol name, java.util.List<Boolean> formals);

	public abstract Access allocLocal(boolean escape);

	public abstract int wordsize();

	public abstract Temp FP();

	public abstract Exp externalCall(String s, ExpList args);

	public abstract Temp RV();

	public abstract Temp R0();

	public abstract void procEntryExit1(java.util.List<Stm> body);

	public abstract void procEntryExit2(java.util.List<Instr> body);

	public abstract void procEntryExit3(java.util.List<Instr> body);

	public abstract List<Temp> registers();

	public abstract String tempMap(Temp temp);

	public abstract ArrayList<Instr> codegen(List<tree.Stm> body) throws Exception;

	public Map<String, Exp> variables = new HashMap<String, Exp>();
}
